import { CACHE_KEY, IStoreData, store } from '@/utils/store/store'
import { IListItem } from '../interfaces'

type TCacheData = NonNullable<IStoreData['cache']>

export interface ICacheStore<K extends keyof TCacheData> {
    saveToStore: (
        key: K,
        value: TCacheData[K] | undefined | null,
    ) => Promise<void>
    getFromStore: (key: K) => Promise<TCacheData[K] | undefined | null>
}

// 缓存store
class CacheStore<K extends keyof TCacheData> implements ICacheStore<K> {
    // 保存到store
    async saveToStore(key: K, value: TCacheData[K] | undefined | null) {
        let cacheData = (await store.get(CACHE_KEY)) || {}
        if (!cacheData) {
            cacheData = {
                [key]: value,
            }
        } else {
            cacheData = {
                ...cacheData,
                [key]: value,
            }
        }
        await store.set(CACHE_KEY, cacheData)
    }

    // 从store中获取
    async getFromStore(key: K) {
        const cacheData = (await store.get(CACHE_KEY)) || {}
        return cacheData[key]
    }
}

// 使用缓存store hook
export const useCacheStore = <K extends keyof TCacheData>(
    key: K,
    defaultValue?: TCacheData[K],
) => {
    const [data, setData] = useState<TCacheData[K] | undefined | null>(
        defaultValue || undefined,
    )

    // 保存到store
    const saveToStore = async (value: TCacheData[K] | undefined | null) => {
        await cacheStore.saveToStore(key, value)
    }

    // 从store中获取
    const getFromStore = async () => {
        const cacheData = await cacheStore.getFromStore(key)
        return cacheData || defaultValue
    }

    // 设置state
    const setState = (value: TCacheData[K] | undefined | null) => {
        setData(value)
        saveToStore(value)
    }

    useEffect(() => {
        getFromStore().then((value) => {
            setData(value)
        })
    }, [])

    return [data, setState] as const
}

export const cacheStore = new CacheStore()
